// src/config/prisma.ts
// Prisma 客户端初始化配置
// 用于在各服务间共享 Prisma 客户端实例

import type { PrismaClient } from '@prisma/client';
import dotenv from 'dotenv';

// 加载环境变量
dotenv.config();
  
let prismaInstance: PrismaClient | null = null;
let initializationError: Error | null = null;

/**
 * 初始化 Prisma 客户端
 * @returns {Promise<PrismaClient>} Prisma 客户端实例
 */
async function initializePrisma(): Promise<PrismaClient> {
  // 如果已经有实例，直接返回
  if (prismaInstance) {
    return prismaInstance;
  }

  // 如果之前初始化失败，直接抛出错误
  if (initializationError) {
    throw initializationError;
  }

  try {
    console.log('正在初始化 Prisma 客户端...');
    
    // 动态导入依赖
    const { PrismaClient } = await import('@prisma/client');
    const { PrismaPg } = await import('@prisma/adapter-pg');
    const { Pool } = await import('pg');
    
    // 创建 PostgreSQL 连接池
    const pool = new Pool({
      connectionString: process.env.DATABASE_URL,
    });
    
    // 创建 Prisma 适配器
    const adapter = new PrismaPg(pool);
    
    // 使用适配器初始化 Prisma 客户端
    prismaInstance = new PrismaClient({
      adapter,
    });
    
    console.log('Prisma 客户端初始化成功');
    return prismaInstance;
  } catch (error) {
    console.error('Prisma 客户端初始化失败:', (error as Error).message);
    console.error('详细错误:', error);
    initializationError = error as Error;
    throw error;
  }
}

/**
 * 获取 Prisma 客户端实例
 * @returns {Promise<PrismaClient>} Prisma 客户端实例
 */
async function getPrisma(): Promise<PrismaClient> {
  return await initializePrisma();
}

export { getPrisma, initializePrisma };